package main

import (
	"fmt"
	"sync"
	"time"
)

/*
   读写锁（读写互斥锁）
	 读写锁可以让多个读操作并发，同时读取，但是对于写操作是完全互斥的。当一个goroutine
	 进行写操作时，其它goroutine既不能进行读操作，也不能进行写操作。
*/

var wg sync.WaitGroup
var mutex sync.RWMutex //读写锁
// 写的方法
func write() {
	mutex.Lock()
	fmt.Println("执行写操作")
	time.Sleep(time.Second * 1)
	mutex.Unlock()
	wg.Done()
}

// 读的方法
func read() {
	mutex.RLock()
	fmt.Println("~~~~执行读操作")
	time.Sleep(time.Second * 1)
	mutex.RUnlock()
	wg.Done()
}

func main() {
	//开启10个协程执行写操作
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go write()
	}

	//开启10个协程执行读操作
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go read()
	}
	wg.Wait()
	fmt.Println("执行完毕")
}
